home *** CD-ROM | disk | FTP | other *** search
-
- /********************************************************************/
- /* SOURCE CODE FILE */
- /********************************************************************/
- /*
- * >>> File name: 6.2 LineObject.c
- *
- * >>> Purpose: Methods for Line Object
- * >>> Project: PoopDraw Version 1
- * >>> Date: 2/20/89
- * >>> By: Adam Treister
- *
- */
- /********************************************************************/
- /* For Your Information 1802 Hillside Rd. SB CA 93101 */
- /********************************************************************/
-
- #include "PoopDrawInc"
-
- /***** Object Type Defs *********************************************/
-
- typedef struct
- {
- _StdObjectFields
- DrawStateRec drawState;
- Point start,end;
-
- } LineObjectRec,*LineObjectPtr,**LineObjectHandle;
-
-
- /***** Public Functions *********************************************/
-
- ObjectHandle NewLineObj(LPtr ParmP);
-
- /***** Private Functions ********************************************/
-
- private ObjDispatch(ObjectHandle ObjectH,int Message,LPtr ParmP);
- private void Frame(LineObjectHandle ObjectH);
- private void Draw(LineObjectHandle ObjectH);
- private void DrawHandles(LineObjectHandle ObjectH);
- private void Move(LineObjectHandle ObjectH,LPtr ParmP);
- private void Track(LineObjectHandle ObjectH,Point pt);
-
- /********************************************************************/
-
- /*------------------------------------------------------------------*/
-
-
- ObjDispatch(ObjectH,Message,ParmP)
- ObjectHandle ObjectH;
- int Message;
- LPtr ParmP;
-
- {
- switch(Message)
- {
-
- case FRAME: Frame(ObjectH); break;
- case DRAW: Draw(ObjectH); break;
- case MOVE: Move(ObjectH,ParmP); break;
- case TRACK: Track(ObjectH,*(Point *)ParmP); break;
- default: DrawObjectDispatch(ObjectH,Message,ParmP);
- }
- }
- /*------------------------------------------------------------------*/
-
- ObjectHandle NewLineObj(ParmP)
- LPtr ParmP;
- {
- LineObjectHandle obj;
- Rect r;
-
- r = *(Rect *)ParmP;
- if (!Width(r) AND !Height(r)) return(NULL);
- obj = _GetHandleToRecord(LineObjectRec);
- NullOutHandle(obj);
- (*obj)->start = topLeft(r);
- (*obj)->end = botRight(r);
- SortRect(&r);
- (*obj)->dispatch = ObjDispatch;
- (*obj)->class = LINE;
- Dispatch(obj,INIT,&r);
- Dispatch(obj,INVAL,NULL);
- return((ObjectHandle)obj);
- }
-
- /*------------------------------------------------------------------*/
-
- void Draw(ObjectH)
- LineObjectHandle ObjectH;
- {
- if (BitTst(&(*ObjectH)->attributes,VisibleBit))
- {
- register DrawStateRec drawState;
- drawState = (*ObjectH)->drawState;
-
- PenNormal();
- PenPat(**(GetPattern(drawState.penPat)));
- PenSize(drawState.penSize,drawState.penSize);
- MoveTo((*ObjectH)->start.h,(*ObjectH)->start.v);
- LineTo((*ObjectH)->end.h,(*ObjectH)->end.v);
-
- if (BitTst(&(*ObjectH)->attributes,SelectedBit))
- {
- DrawHandles(ObjectH);
- }
- }
- }
- /*------------------------------------------------------------------*/
-
- void Frame(ObjectH)
- LineObjectHandle ObjectH;
- {
- Rect r;
- int cushion;
-
- PenNormal(); PenSize(2,2);
- r = (*ObjectH)->bounds;
- cushion = ((*ObjectH)->start.h < (*ObjectH)->end.h) ? 2 : -2;
- MoveTo((*ObjectH)->start.h-cushion,(*ObjectH)->start.v-2);
- LineTo((*ObjectH)->end.h+cushion,(*ObjectH)->end.v-2);
- Line(0,4);
- LineTo((*ObjectH)->start.h-cushion,(*ObjectH)->start.v+2);
- Line(0,-4);
- }
- /*------------------------------------------------------------------*/
-
-
- void DrawHandles(ObjectH)
- register LineObjectHandle ObjectH;
-
- {
- Rect r,objRect;
- PenState penSave;
-
- GetPenState(&penSave);
- PenPat(black); PenMode(patXor);
-
- SetRect(&r,(*ObjectH)->start.h-(HANDLEWIDTH/2),(*ObjectH)->start.v-(HANDLEWIDTH/2),
- (*ObjectH)->start.h+(HANDLEWIDTH/2),(*ObjectH)->start.v+(HANDLEWIDTH/2));
-
- PaintRect(&r);
- SetRect(&r,(*ObjectH)->end.h-(HANDLEWIDTH/2),(*ObjectH)->end.v-(HANDLEWIDTH/2),
- (*ObjectH)->end.h+(HANDLEWIDTH/2),(*ObjectH)->end.v+(HANDLEWIDTH/2));
- PaintRect(&r);
- SetPenState(&penSave);
- }
- /*------------------------------------------------------------------*/
- void Move(ObjectH,ParmP)
- register LineObjectHandle ObjectH;
- LPtr ParmP;
-
- {
- int dh,dv;
-
- if (*ParmP == 0x8000) return;
- dv = HiWord(*ParmP); dh = LoWord(*ParmP);
- Dispatch(ObjectH,INVAL,NULL);
- OffsetRect(&(*ObjectH)->bounds,dh,dv);
- (*ObjectH)->start.h +=dh; (*ObjectH)->start.v += dv;
- (*ObjectH)->end.h +=dh; (*ObjectH)->end.v += dv;
- Dispatch(ObjectH,INVAL,NULL);
- }
-
- /*------------------------------------------------------------------*/
-
-
- void Track(ObjectH,pt)
- LineObjectHandle ObjectH;
- Point pt;
-
- {
-
- Rect start,end,r;
- Boolean InStart;
- Point curPos,lastPos;
-
- SetRect(&start,(*ObjectH)->start.h-(HANDLEWIDTH/2),(*ObjectH)->start.v-(HANDLEWIDTH/2),
- (*ObjectH)->start.h+(HANDLEWIDTH/2),(*ObjectH)->start.v+(HANDLEWIDTH/2));
-
- SetRect(&end,(*ObjectH)->end.h-(HANDLEWIDTH/2),(*ObjectH)->end.v-(HANDLEWIDTH/2),
- (*ObjectH)->end.h+(HANDLEWIDTH/2),(*ObjectH)->end.v+(HANDLEWIDTH/2));
-
- if (PtInRect(pt,&start)) InStart = TRUE;
- else if (PtInRect(pt,&end)) InStart = FALSE;
- else return;
-
- SetRect(&r,pt.h-3,pt.v-3,pt.h+3,pt.v+3);
- EraseRect(&r); InvalRect(&r);
- DrawLine((*ObjectH)->start,(*ObjectH)->end);
- PenMode(patXor);
-
- while (StillDown())
- {
- GetMouse(&curPos);
- if ((curPos.h != lastPos.h) OR (curPos.v != lastPos.v))
- {
-
- DrawLine((*ObjectH)->start,(*ObjectH)->end);
- if (InStart) (*ObjectH)->start = curPos;
- else (*ObjectH)->end = curPos;
- DrawLine((*ObjectH)->start,(*ObjectH)->end);
- lastPos = curPos;
-
- } }
- SetRect(&(*ObjectH)->bounds,(*ObjectH)->start.h,(*ObjectH)->start.v,
- (*ObjectH)->end.h,(*ObjectH)->end.v);
- SortRect(&(*ObjectH)->bounds);
- Dispatch(ObjectH,INVAL,NULL);
- PenNormal();
- }
-